/**
  * Author: Mei
  * Date: 2020-12-25 9:36
  * Description: 线程的创建
  *
  */
#include "head.h"

using namespace std;

void func() {
    cout << "do some work" << endl;
}

void func1(int i) {
    cout << "print(i=" << i << ")" << endl;
}

//用容器来管理线程对象
vector<thread> g_list;
vector<shared_ptr<thread>> g_list2;

void CreateThread() {
    thread t(func);
    g_list.push_back(move(t));
    g_list2.push_back(make_shared<thread>(func));
}

int main() {
    //1、线程的创建
    thread t(func);
    t.join(); //join()函数将会阻塞当前主线程  直到t线程执行结束 如果不希望阻塞 可以调用detach()
    //t.detach(); //主线程和子线程分离

    thread tt(func1, 10);
    tt.join();

    thread tt1([]() {
        cout << "lambda" << endl;
    });


    //线程不能复制，但可以移动
    thread tt3(move(tt1));
    tt3.join();

    thread tt4(bind(func1, 20));
    tt4.join();

    //执行func函数可能会抛出异常，因为线程对象可能先于线程函数结束
    //解决办法1、可以通过join、detach、还可以将线程对象保存到一个容器中，以保证线程对象的生命周期
    CreateThread();
    for(auto &thread : g_list) {
        thread.join();
    }
    for(auto &thread : g_list2) {
        thread->join();
    }


    //tt1.join();
    return 0;
}